package com.eastfair.auth.entity;

import cn.afterturn.easypoi.excel.annotation.Excel;
import cn.afterturn.easypoi.excel.annotation.ExcelEntity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.eastfair.core.base.entity.Entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
import lombok.experimental.Accessors;
import static com.eastfair.core.utils.DateUtils.DEFAULT_DATE_TIME_FORMAT;
import com.eastfair.annotation.model.EchoVO;
import com.eastfair.auth.enumeration.RoleRoleTypeEnum;
import com.eastfair.auth.enumeration.RoleDsTypeEnum;

import static com.baomidou.mybatisplus.annotation.SqlCondition.LIKE;

/**
 * <p>
 * 实体类
 * 
 * </p>
 *
 * @author ligang
 * @since 2022-09-21
 */
@Data
@NoArgsConstructor
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("c_role")
@ApiModel(value = "Role", description = "")
@AllArgsConstructor
public class Role extends Entity<Long> implements EchoVO {

    private static final long serialVersionUID = 1L;
    @TableField(exist = false)
    private Map<String, Object> echoMap = new HashMap<>();
    /**
     * 角色名称
     */
    @ApiModelProperty(value = "角色名称")
    @Size(max = 255, message = "角色名称长度不能超过255")
    @TableField(value = "name", condition = LIKE)
    @Excel(name = "角色名称")
    private String name;

    /**
     * 角色code码
     */
    @ApiModelProperty(value = "角色code码")
    @Size(max = 255, message = "角色code码长度不能超过255")
    @TableField(value = "code", condition = LIKE)
    @Excel(name = "角色code码")
    private String code;

    /**
     * 数据权限#{ALL:1,查看全部;THIS_LEVEL_CHILDER:2,本组以及子组;THIS_LEVEL:3,查本组;ASSIGN_LEVEL:4,查所指组和人;SELF:5,只查本人;}
     */
    @ApiModelProperty(value = "数据权限#{ALL:1,查看全部;THIS_LEVEL_CHILDER:2,本组以及子组;THIS_LEVEL:3,查本组;ASSIGN_LEVEL:4,查所指组和人;SELF:5,只查本人;}")
    @TableField(value = "ds_type")
    @Excel(name = "数据权限#{ALL:1,查看全部;THIS_LEVEL_CHILDER:2,本组以及子组;THIS_LEVEL:3,查本组;ASSIGN_LEVEL:4,查所指组和人;SELF:5,只查本人;}", replace = {"1_ALL", "2_THIS_LEVEL_CHILDER", "3_THIS_LEVEL", "4_ASSIGN_LEVEL", "5_SELF",  "_null"})
    private RoleDsTypeEnum dsType;

    /**
     * 角色类型#{P_ADMIN:厦门智慧场馆管理员;P_VENUE_ADMIN:场馆业务系统管理员;P_CERTIFICATE_ADMIN:证件系统管理员;P_COMPOSITE_VENUE_ADMIN:综合-场馆管理员;P_COMPOSITE_COURT_ADMIN:综合-主场管理员;P_COMPOSITE_PRODUCER_ADMIN:综合-搭建商管理员;P_COMPOSITE_PRODUCER_COMPANY:综合-搭建商公司角色;P_COMPOSITE_TRANSPORT_ADMIN:综合-主运管理员;P_COMPOSITE_TRANSPORT_COMPANY:综合-主运系统公司角色;P_COMPOSITE_TRADE_ADMIN:综合-商旅管理员;P_COMPOSITE_MATING_ADMIN:综合-配套商管理员;P_COMPOSITE_MATING_COMPANY:综合-配套商公司角色;P_PAY_ADMIN:支付系统管理员;P_EXHIBITOR_SELF_ADMIN:展商自服务管理员;P_CATERINGAPP_ADMIN:餐饮小程序用户;P_CATERING_ADMIN:餐饮后台管理员;P_PORTAL_OUT_VENUE_ADMIN:对外门户后台管理员;P_PORTAL_OUT_OPERATION_ADMIN:对外门户运营管理员;P_PORTAL_IN_WORK_ADMIN:内部门户后台管理员;P_PORTAL_IN_WORKAPP_ADMIN:内部门户APP用户;P_OPERATION_CENTER_ADMIN:智慧运营中心管理员;P_VISITOR_FRONT_ADMIN:访客系统用户;P_VISITOR_BACK_ADMIN:访客后台管理员;other:其他;}
     */
    @ApiModelProperty(value = "角色类型#{P_ADMIN:厦门智慧场馆管理员;P_VENUE_ADMIN:场馆业务系统管理员;P_CERTIFICATE_ADMIN:证件系统管理员;P_COMPOSITE_VENUE_ADMIN:综合-场馆管理员;P_COMPOSITE_COURT_ADMIN:综合-主场管理员;P_COMPOSITE_PRODUCER_ADMIN:综合-搭建商管理员;P_COMPOSITE_PRODUCER_COMPANY:综合-搭建商公司角色;P_COMPOSITE_TRANSPORT_ADMIN:综合-主运管理员;P_COMPOSITE_TRANSPORT_COMPANY:综合-主运系统公司角色;P_COMPOSITE_TRADE_ADMIN:综合-商旅管理员;P_COMPOSITE_MATING_ADMIN:综合-配套商管理员;P_COMPOSITE_MATING_COMPANY:综合-配套商公司角色;P_PAY_ADMIN:支付系统管理员;P_EXHIBITOR_SELF_ADMIN:展商自服务管理员;P_CATERINGAPP_ADMIN:餐饮小程序用户;P_CATERING_ADMIN:餐饮后台管理员;P_PORTAL_OUT_VENUE_ADMIN:对外门户后台管理员;P_PORTAL_OUT_OPERATION_ADMIN:对外门户运营管理员;P_PORTAL_IN_WORK_ADMIN:内部门户后台管理员;P_PORTAL_IN_WORKAPP_ADMIN:内部门户APP用户;P_OPERATION_CENTER_ADMIN:智慧运营中心管理员;P_VISITOR_FRONT_ADMIN:访客系统用户;P_VISITOR_BACK_ADMIN:访客后台管理员;other:其他;}")
    @TableField(value = "role_type")
    @Excel(name = "角色类型#{P_ADMIN:厦门智慧场馆管理员;P_VENUE_ADMIN:场馆业务系统管理员;P_CERTIFICATE_ADMIN:证件系统管理员;P_COMPOSITE_VENUE_ADMIN:综合-场馆管理员;P_COMPOSITE_COURT_ADMIN:综合-主场管理员;P_COMPOSITE_PRODUCER_ADMIN:综合-搭建商管理员;P_COMPOSITE_PRODUCER_COMPANY:综合-搭建商公司角色;P_COMPOSITE_TRANSPORT_ADMIN:综合-主运管理员;P_COMPOSITE_TRANSPORT_COMPANY:综合-主运系统公司角色;P_COMPOSITE_TRADE_ADMIN:综合-商旅管理员;P_COMPOSITE_MATING_ADMIN:综合-配套商管理员;P_COMPOSITE_MATING_COMPANY:综合-配套商公司角色;P_PAY_ADMIN:支付系统管理员;P_EXHIBITOR_SELF_ADMIN:展商自服务管理员;P_CATERINGAPP_ADMIN:餐饮小程序用户;P_CATERING_ADMIN:餐饮后台管理员;P_PORTAL_OUT_VENUE_ADMIN:对外门户后台管理员;P_PORTAL_OUT_OPERATION_ADMIN:对外门户运营管理员;P_PORTAL_IN_WORK_ADMIN:内部门户后台管理员;P_PORTAL_IN_WORKAPP_ADMIN:内部门户APP用户;P_OPERATION_CENTER_ADMIN:智慧运营中心管理员;P_VISITOR_FRONT_ADMIN:访客系统用户;P_VISITOR_BACK_ADMIN:访客后台管理员;other:其他;}", replace = {"厦门智慧场馆管理员_P_ADMIN", "场馆业务系统管理员_P_VENUE_ADMIN", "证件系统管理员_P_CERTIFICATE_ADMIN", "综合-场馆管理员_P_COMPOSITE_VENUE_ADMIN", "综合-主场管理员_P_COMPOSITE_COURT_ADMIN", "综合-搭建商管理员_P_COMPOSITE_PRODUCER_ADMIN", "综合-搭建商公司角色_P_COMPOSITE_PRODUCER_COMPANY", "综合-主运管理员_P_COMPOSITE_TRANSPORT_ADMIN", "综合-主运系统公司角色_P_COMPOSITE_TRANSPORT_COMPANY", "综合-商旅管理员_P_COMPOSITE_TRADE_ADMIN", "综合-配套商管理员_P_COMPOSITE_MATING_ADMIN", "综合-配套商公司角色_P_COMPOSITE_MATING_COMPANY", "支付系统管理员_P_PAY_ADMIN", "展商自服务管理员_P_EXHIBITOR_SELF_ADMIN", "餐饮小程序用户_P_CATERINGAPP_ADMIN", "餐饮后台管理员_P_CATERING_ADMIN", "对外门户后台管理员_P_PORTAL_OUT_VENUE_ADMIN", "对外门户运营管理员_P_PORTAL_OUT_OPERATION_ADMIN", "内部门户后台管理员_P_PORTAL_IN_WORK_ADMIN", "内部门户APP用户_P_PORTAL_IN_WORKAPP_ADMIN", "智慧运营中心管理员_P_OPERATION_CENTER_ADMIN", "访客系统用户_P_VISITOR_FRONT_ADMIN", "访客后台管理员_P_VISITOR_BACK_ADMIN", "其他_OTHER",  "_null"})
    private RoleRoleTypeEnum roleType;

    /**
     * 描述
     */
    @ApiModelProperty(value = "描述")
    @Size(max = 255, message = "描述长度不能超过255")
    @TableField(value = "description", condition = LIKE)
    @Excel(name = "描述")
    private String description;

    /**
     * 是否生效(默认1：可用 0:不可用)
     */
    @ApiModelProperty(value = "是否生效(默认1：可用 0:不可用)")
    @TableField(value = "is_enabled")
    @Excel(name = "是否生效(默认1：可用 0:不可用)")
    private Integer isEnabled;

    /**
     * 是否删除(默认0：未删除 1:已删除)
     */
    @ApiModelProperty(value = "是否删除(默认0：未删除 1:已删除)")
    @TableField(value = "is_deleted")
    @Excel(name = "是否删除(默认0：未删除 1:已删除)")
    private Integer isDeleted;

    /**
     * 租户id
     */
    @ApiModelProperty(value = "租户id")
    @TableField(value = "tenant_id")
    @Excel(name = "租户id")
    private Long tenantId;

    /**
     * 项目id
     */
    @ApiModelProperty(value = "项目id")
    @TableField(value = "project_id")
    @Excel(name = "项目id")
    private Long projectId;

    /**
     * 子系统id
     */
    @ApiModelProperty(value = "子系统id")
    @TableField(value = "subsystem_id")
    @Excel(name = "子系统id")
    private Long subsystemId;

    /**
     * 业务标识
     */
    @ApiModelProperty(value = "业务标识")
    @Size(max = 255, message = "业务标识长度不能超过255")
    @TableField(value = "business_tag", condition = LIKE)
    @Excel(name = "业务标识")
    private String businessTag;

    /**
     * 团队ID
     */
    @ApiModelProperty(value = "团队ID")
    @TableField(value = "team_id")
    @Excel(name = "团队ID")
    private Long teamId;

    /**
     * 来源角色id
     */
    @ApiModelProperty(value = "来源角色id")
    @TableField(value = "source_role_id")
    @Excel(name = "来源角色id")
    private Long sourceRoleId;


    @Builder
    public Role(Long id, LocalDateTime createTime, Long createdBy, LocalDateTime updateTime, Long updatedBy, 
                    String name, String code, RoleDsTypeEnum dsType, RoleRoleTypeEnum roleType, String description, 
                    Integer isEnabled, Integer isDeleted, Long tenantId, Long projectId, Long subsystemId, String businessTag, 
                    Long teamId, Long sourceRoleId) {
        this.id = id;
        this.createTime = createTime;
        this.createdBy = createdBy;
        this.updateTime = updateTime;
        this.updatedBy = updatedBy;
        this.name = name;
        this.code = code;
        this.dsType = dsType;
        this.roleType = roleType;
        this.description = description;
        this.isEnabled = isEnabled;
        this.isDeleted = isDeleted;
        this.tenantId = tenantId;
        this.projectId = projectId;
        this.subsystemId = subsystemId;
        this.businessTag = businessTag;
        this.teamId = teamId;
        this.sourceRoleId = sourceRoleId;
    }

}
